<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // - 理解
    // - 就是一块"地盘", 一个代码段所在的区域

    // let a = 1;// 全局
    // let fn = function () {
    //     let b = 2;// 局部
    // };
    // let obj = {
    //     c: 3,
    //     d: function () {
    //         let f = 5;// 局部
    //     }
    // };
    // let arr = [1,2,3,4];
    // arr.forEach(function(){
    //     let m = 9;
    // })

    // - 它是静态的(相对于上下文对象), 在编写代码时就确定了
    // 1
    // let a = 1;
    // function fn(){
    //     console.log(a);// 1
    // }
    // fn();
    // const obj = {
    //     fn
    // };
    // obj.fn();


    // - 分类
    // - 全局作用域:任何不在函数或是大括号中声明的变量,都是在全局作用域下,全局作用域中声明的变量可以在程序的任意位置访问
    // // let,const拥有块级作用域，var没有。
    // // 全局作用域
    // let a = 1;
    // // 局部作用域
    // function fn(){
    //     let a = 2;
    // }
    // // 局部作用域
    // {
    //     let a = 3;//  局部
    //     var b = 4;// 全局
    // }
    // if(1===1){
    //     var f = 5;// 全局
    // }
    // console.log(b,f)






    // - 函数作用域:如果一个变量是在函数内部声明的,它就在局部作用域下,这个变量只能在函数内部访问,不能再函数以外去访问
    {
        // // 1
        // // let a = 1;
        // // function fn(a){
        // //     // 接收的形参是局部的，相当于定义了一个变量名字为a,值为1
        // //     a = 100;
        // // }
        // // fn(a);// fn(1)
        // // console.log(a);// 1
        //
        //
        // // 2
        // // let obj = {a:1};
        // // function fn(obj){
        // //     obj.a = 100;
        // // }
        // // fn(obj);
        // // console.log(obj.a);// 100
        //
        // // 3
        // let obj = {a:1}
        // function fn(obj){
        //     // let obj2 = obj;
        //     obj.a = 100;
        // }
        // fn(obj);
        // console.log(obj.a);
    }
    // - 没有块作用域(`ES6`有了):`ES6`引入了`let`和`const`关键字,和var关键字不同,在大括号中使用`let`和`const`声明的变量存在于块级作用域中,
    //   在大括号之外不能访问这些变量
    // // function fn(){
    // //     // 函数作用域，let const var 都支持
    // //     let a = 1;
    // //     const b = 2;
    // //     var c = 3;
    // // }
    // // {
    // //     // 块级作用域：let const 支持，var不支持
    // //     let a = 1;// 在外部无法调用
    // //     const b = 2;// 在外部无法调用
    // //     var c = 3;// 在外部可以调用c
    // // }
    // // if(1===1){
    // //     // 块级作用域：let const 支持，var不支持
    // //     let a = 1;// 在外部无法调用
    // //     const b = 2;// 在外部无法调用
    // //     var c = 3;// 在外部可以调用c
    // // }
    //
    // for(let i=0;i<10;i++){
    //     // 块级
    //     let j = 100;
    // }
    // console.log(i);







    // - 作用
    // - 隔离变量，不同作用域下同名变量不会有冲突
    {
        let a = 1;
        {
            {
                let a = 3;
                console.log(a);
            }
            console.log(a);
        }
    }

</script>
</html>